﻿/*
 * Description: 处理WMS->MES出库信息json
 * Copyright (c) : 通力凯顿（北京）系统集成有限公司
 * Writer:zhunan
 * create Date:2025.9.18
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Collections;
using DatabaseAccess.DBUtility;
using Newtonsoft.Json;
using System.Data;
using log4net;
using System.IO;

namespace SendIndustrialNetwork.Service
{
    class SaveContainerMaterialService
    {
        ERPSendMESDataMethod erpMethod = new ERPSendMESDataMethod();
        private static object thisLock = new object();//创建对象锁 

        /// <summary>
        /// 数据处理（唯一对外方法）
        /// </summary>
        public void Excute()
        {
            SaveContainerMaterial();
        }

        void SaveContainerMaterial()
        {
            try
            {
                string folderPath = ConfigurationManager.AppSettings["saveFilePath"].ToString();
                if (!Directory.Exists(folderPath)) return;
                // 获取指定路径下的所有文件（不包含子目录）
                string[] files = Directory.GetFiles(folderPath);
                // 遍历所有文件并输出文件名
                foreach (string file in files)
                {
                    // 获取仅包含文件名（不含路径）
                    string fileName = Path.GetFileName(file);
                    if (!fileName.StartsWith("WMS-MES_OUTBOUND_FEEDBACK-")) continue;
                    string filepath = folderPath + "\\" + fileName;
                    string jsonContent = File.ReadAllText(filepath).Trim();
                    if (jsonContent.ToString() == "")
                    {
                        File.Delete(filepath);
                        continue;
                    };

                    Dictionary<string, object> dict = new Dictionary<string, object>();
                    try
                    {
                        dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonContent);
                    }
                    catch (Exception)
                    {
                        LogHelp.WriteLog(string.Format("文件不是合法json", jsonContent));
                        File.Delete(filepath);
                        continue;
                    }
                    if (!dict.ContainsKey("itemList"))
                    {
                        LogHelp.WriteLog(string.Format("json缺少itemList项", jsonContent));
                        File.Delete(filepath);
                        continue;
                    };

                    DataTable dt = JsonConvert.DeserializeObject<DataTable>(dict["itemList"].ToString());
                    string strContainers = "";
                    string strMessage = jsonContent;

                    DataTable xmlTable = new DataTable();
                    xmlTable.Columns.Add("mfgordername");
                    xmlTable.Columns.Add("containerName");
                    xmlTable.Columns.Add("CLPH");//材料牌号	
                    xmlTable.Columns.Add("SXH");//实发数量/顺序号
                    xmlTable.Columns.Add("LH");//熔炉号	
                    xmlTable.Columns.Add("JXPH");//检验编号
                    xmlTable.Columns.Add("KFBG");//库房保管(物资部发料人)
                    xmlTable.Columns.Add("QCJY");//器材检验(物资检验人)
                    xmlTable.Columns.Add("DLPH");//代料牌号
                    xmlTable.Columns.Add("DLGG");//代料规格
                    xmlTable.Columns.Add("DLDH");//代料单号
                    xmlTable.Columns.Add("PXZYDH");//平行作业单号
                    xmlTable.Columns.Add("PXZYGX");//平行作业工序
                    xmlTable.Columns.Add("productName");//零件图号
                    xmlTable.Columns.Add("ChildContainerName");//批量带子序号的子流水卡，否则则是原流水卡
                    xmlTable.Columns.Add("NAME1");
                    xmlTable.Columns.Add("GKDB");//顾客代表
                    xmlTable.Columns.Add("DLBZ");//代料标准
                    xmlTable.Columns.Add("BHGSL");//不合格审理单号
                    xmlTable.Columns.Add("XLR");//下料人（报工人）
                    xmlTable.Columns.Add("XLSJ");//下料时间
                    xmlTable.Columns.Add("XLJY");//下料检验
                    xmlTable.Columns.Add("JYSJ");//检验时间
                    xmlTable.Columns.Add("XLJS");//下料数量
                    xmlTable.Columns.Add("HGSL");//合格数量
                    xmlTable.Columns.Add("BFSL");//报废数量
                    xmlTable.Columns.Add("CCSL");//超差数量
                    xmlTable.Columns.Add("FXSL");//返修数量
                    xmlTable.Columns.Add("BZ");//备注

                    Dictionary<string, string> strLH = new Dictionary<string, string>();

                    try
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            DataRow dr = xmlTable.NewRow();
                            dr["mfgordername"] = row["AFKO-AUFNR"].ToString();
                            string productName = row["LJH"].ToString();
                            DataTable temDt = erpMethod.GetProductByMfgorder(dr["mfgordername"].ToString());
                            if (temDt.Rows.Count > 0)
                            {
                                productName = temDt.Rows[0]["ProductName"].ToString();
                            }
                            dr["containerName"] = productName + "/" + row["AFPO-CHARG"].ToString();
                            dr["CLPH"] = row["CLPH"].ToString();//材料牌号	
                            dr["SXH"] = row["AFKO-GAMNG"].ToString();//实发数量/顺序号
                            dr["LH"] = row["LH"].ToString().Replace(":", "：");//熔炉号
                            dr["JXPH"] = row["JXPH"];//检验编号	
                            //add:Wangjh 20180613 存储熔炉号，可能同一批次多个熔炉号
                            if (strLH.ContainsKey(dr["containerName"].ToString()))
                            {
                                strLH[dr["containerName"].ToString()] += "," + string.Format("{0}:{1}:{2}", dr["LH"], dr["SXH"], dr["JXPH"]);
                            }
                            else
                            {
                                strLH.Add(dr["containerName"].ToString(), string.Format("{0}:{1}:{2}", dr["LH"], dr["SXH"], dr["JXPH"]));
                            }
                            dr["KFBG"] = row["KFBG"].ToString();//库房保管(物资部发料人)
                            dr["QCJY"] = row["QCJY"].ToString();//器材检验(物资检验人)
                            dr["DLPH"] = row["DLPH"].ToString();//代料牌号
                            dr["DLGG"] = row["DLGG"].ToString();//代料规格
                            dr["DLDH"] = row["DLDH"].ToString();//代料单号
                            if (row["DLBZ"] != null)
                            {
                                dr["DLBZ"] = row["DLBZ"].ToString();//代料标准
                            }

                            dr["PXZYDH"] = row["PXZYDH"].ToString();//平行作业单号
                            dr["PXZYGX"] = row["PXZYGX"].ToString();//平行作业工序
                            dr["productName"] = productName;//零件图号
                            dr["ChildContainerName"] = dr["containerName"];
                            dr["NAME1"] = row["NAME1"].ToString();//供应商
                            if (row["GKDB"] != null)
                            {
                                dr["GKDB"] = row["GKDB"].ToString();//顾客代表
                            }
                            if (row["BHGSL"] != null)
                            {
                                dr["BHGSL"] = row["BHGSL"].ToString();//不合格审理单号
                            }
                            if (row["XLR"] != null)
                            {
                                dr["XLR"] = row["XLR"].ToString();//下料人（报工人）
                            }
                            if (row["XLSJ"] != null)
                            {
                                dr["XLSJ"] = row["XLSJ"].ToString();//下料时间
                            }
                            if (row["XLJY"] != null)
                            {
                                dr["XLJY"] = row["XLJY"].ToString();//下料检验
                            }
                            if (row["JYSJ"] != null)
                            {
                                dr["JYSJ"] = row["JYSJ"].ToString();//检验时间
                            }
                            if (row["XLJS"] != null)
                            {
                                dr["XLJS"] = row["XLJS"].ToString();//下料数量
                            }
                            if (row["HGSL"] != null)
                            {
                                dr["HGSL"] = row["HGSL"].ToString();//合格数量
                            }
                            if (row["BFSL"] != null)
                            {
                                dr["BFSL"] = row["BFSL"].ToString();//报废数量
                            }
                            if (row["CCSL"] != null)
                            {
                                dr["CCSL"] = row["CCSL"].ToString();//超差数量
                            }
                            if (row["FXSL"] != null)
                            {
                                dr["FXSL"] = row["FXSL"].ToString();//返修数量
                            }
                            if (row["BZ"] != null)
                            {
                                dr["BZ"] = row["BZ"].ToString();//备注
                            }
                            xmlTable.Rows.Add(dr);
                        }
                        xmlTable.AcceptChanges();
                    }
                    catch (Exception ex)
                    {
                        LogHelp.WriteLog(ex.Message);
                        File.Delete(filepath);
                        continue;
                    }

                    //处理数据
                    string tempContainerName = "";
                    foreach (DataRow dr in xmlTable.Rows)
                    {
                        Dictionary<string, string> strList = new Dictionary<string, string>();
                        if (tempContainerName == dr["ChildContainerName"].ToString())//同一批次推了多次,多熔炉号
                            continue;
                        try
                        {
                            strList.Add("containerName", dr["ChildContainerName"].ToString());
                            strList.Add("材料牌号", dr["CLPH"].ToString());
                            if (!string.IsNullOrWhiteSpace(strLH[dr["ChildContainerName"].ToString()]))
                            {
                                erpMethod.UpdateBatchcomments(strLH[dr["ChildContainerName"].ToString()], dr["ChildContainerName"].ToString());
                            }
                            var sxhs = strLH[dr["ChildContainerName"].ToString()].Split(',');
                            if (sxhs.Length > 1)
                            {
                                double sxh = 0;
                                foreach (var _sxh in sxhs)
                                {
                                    sxh += Convert.ToDouble(_sxh.Split(':')[1]);
                                }
                                dr["SXH"] = sxh.ToString();
                            }
                        }
                        catch (Exception ex)
                        {

                        }

                        strList.Add("实发数/顺序号", dr["SXH"].ToString());

                        strList.Add("熔炉号母", dr["LH"].ToString());
                        //strList.Add("熔炉号母", strLH["ChildContainerName"].ToString());
                        strList.Add("检验编号", dr["JXPH"].ToString());
                        strList.Add("库房保管", dr["KFBG"].ToString());
                        strList.Add("器材检验", dr["QCJY"].ToString());
                        strList.Add("代料牌号", dr["DLPH"].ToString());
                        strList.Add("代料规格", dr["DLGG"].ToString());
                        strList.Add("代料单号", dr["DLDH"].ToString());
                        strList.Add("代料标准", dr["DLBZ"].ToString());
                        strList.Add("平行作业单号", dr["PXZYDH"].ToString());
                        strList.Add("平行作业工序", dr["PXZYGX"].ToString());
                        strList.Add("发料时间", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));//add:Wangjh 20181115 增加发料时间属性
                        strList.Add("供应商", dr["NAME1"].ToString());
                        strList.Add("顾客代表", dr["GKDB"].ToString());
                        strList.Add("不合格审理单号", dr["BHGSL"].ToString());//不合格审理单号

                        //报工信息
                        var reportInfo = new Dictionary<string, string>();
                        reportInfo.Add("containerName", dr["containerName"].ToString());//备注
                        reportInfo.Add("XLR", dr["XLR"].ToString());//下料人（报工人）
                        reportInfo.Add("XLSJ", dr["XLSJ"].ToString());//下料时间   
                        reportInfo.Add("XLJY", dr["XLJY"].ToString());//下料检验  
                        reportInfo.Add("JYSJ", dr["JYSJ"].ToString());//检验时间   
                        reportInfo.Add("XLJS", dr["XLJS"].ToString());//下料数量
                        reportInfo.Add("HGSL", dr["HGSL"].ToString());//合格数量
                        reportInfo.Add("BFSL", dr["BFSL"].ToString());//报废数量
                        reportInfo.Add("CCSL", dr["CCSL"].ToString());//超差数量
                        reportInfo.Add("FXSL", dr["FXSL"].ToString());//返修数量
                        reportInfo.Add("BZ", dr["BZ"].ToString());//备注

                        tempContainerName = dr["ChildContainerName"].ToString();
                        string message;

                        //if (dr["ChildContainerName"] == dr["containerName"])
                        //    message = erpMethod.SaveMaterialNew(strList);
                        //else//批量带子序号
                        //    message = erpMethod.SaveChildContainerMaterial(strList);

                        message = erpMethod.SaveMaterialNew(strList);

                        LogHelp.WriteLog(String.Format("更新批次{0}属性{1}", strList["containerName"], message));

                        //下料报工
                        string reportMsg = "";
                        lock (thisLock)
                        {
                            reportMsg = erpMethod.ContainerFisrtAutoCheck(reportInfo);
                        }
                        //如果含有代料单号，需要重新工艺校对
                        if (!string.IsNullOrWhiteSpace(strList["代料单号"]))
                        {
                            erpMethod.ContainerAgainWFConfirm(dr["containerName"].ToString());
                        }

                        if (message.Trim() == "成功")
                        {
                            //对于平行作业暂停的批次，有器材检验的数据后应释放 add:Wangjh 20220713
                            if (!string.IsNullOrWhiteSpace(strList["器材检验"]))
                            {
                                erpMethod.ReleaseContainerByPXZY(dr["containerName"].ToString());
                            }
                            string strContainerID = erpMethod.GetContainerID(dr["ChildContainerName"].ToString());
                            string logmessage = string.Format(@"批次{0}发料信息接收成功,{1}", dr["ChildContainerName"].ToString(), reportMsg);
                            LogHelp.WriteLog(logmessage);
                            string insertLogSql = @"INSERT INTO interface_log(logtype,logmessage,loglevel,createdate,xml,logid)
VALUES('ERP_Send_Material_Service','{0}','INFO',sysdate,'{1}','{2}')";
                            if (jsonContent.Length > 4000)
                            {
                                jsonContent = "xml太长";
                            }
                            insertLogSql = string.Format(insertLogSql, logmessage, jsonContent, Guid.NewGuid().ToString());
                            DatabaseAccess.DBUtility.DatabaseHelper.ExecuteSql(insertLogSql);
                            strContainers = String.Format("{0}{1},", strContainers, strContainerID);
                        }
                        else
                        {
                            string logmessage = "批次" + dr["ChildContainerName"].ToString() + "接收失败" + message + reportMsg;
                            LogHelp.WriteLog(logmessage);
                            string insertLogSql = @"INSERT INTO interface_log(logtype,logmessage,loglevel,createdate,xml,logid)
VALUES('ERP_Send_Material_Service','{0}','INFO',sysdate,'{1}','{2}')";
                            if (jsonContent.Length > 4000)
                            {
                                jsonContent = "xml太长";
                            }
                            insertLogSql = string.Format(insertLogSql, logmessage, jsonContent, Guid.NewGuid().ToString());
                            DatabaseAccess.DBUtility.DatabaseHelper.ExecuteSql(insertLogSql);
                        }
                    }
                    File.Delete(filepath);//删除掉json文件
                }

            }
            catch (Exception ex)
            {
                LogHelp.WriteLog(ex.Message);
            }
        }
    }
}
